//
//  RootViewController.m
//  UI22_线程
//
//  Created by dllo on 15/12/9.
//  Copyright (c) 2015年 dllo. All rights reserved.
//

#import "RootViewController.h"
#import "MyOperation.h"

@interface RootViewController ()
@property (retain, nonatomic) IBOutlet UIImageView *imageV;

@end

@implementation RootViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.
    self.view.backgroundColor = [UIColor whiteColor];
    
    
    
    
}
- (IBAction)ThreadAction:(id)sender {
    
    // NSThread系统提供的轻量级线程方式
    // 优点:创建简单
    // 缺点:提供了太多操作需要自己设置, 若要使用需要对线程特别了解
    // 每创建一个对象就是一个线程
    NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(thAction) object:nil];
    
    // 开始执行线程
    [thread start];
    [thread release];
    
    NSLog(@"主线程%@", [NSThread mainThread]);
    NSLog(@"判断是否为主线程:%d", [NSThread isMainThread]);
    
//    for (NSInteger i = 0; i < 600000000; i++) {
//        NSLog(@"主线程%ld", i);
//    }
    
    [NSThread sleepForTimeInterval:2.0];
    NSLog(@"主线程休眠结束");
    
}

- (void)thAction
{
    NSLog(@"当前线程:%@", [NSThread currentThread]);
    
//    for (NSInteger i = 0; i < 600000000; i++) {
//        NSLog(@"分支线程%ld", i);
//    }
    
    // 休眠
    [NSThread sleepForTimeInterval:1.0];
    NSLog(@"分支线程休眠结束");
    
}

- (IBAction)objectAction:(id)sender {
    
    // NSObject 的线程方式
    // 优点:使用简单
    // 缺点:没有线程安全方面的控制
    [self performSelectorInBackground:@selector(thAction) withObject:nil];
    
    [NSThread sleepForTimeInterval:2.0];
    NSLog(@"主线程休眠结束");
}

- (IBAction)operationAction:(id)sender {
    
    // NSOperation本身并没有并发的能力, 需要添加进NSOperationQueue队列中才可执行NSOperatiion仅是单独执行里面的main方法
    MyOperation *op1 = [[MyOperation alloc] init];
//    [op1 start];
    
    MyOperation *op2 = [[MyOperation alloc] init];
    MyOperation *op3 = [[MyOperation alloc] init];
    MyOperation *op4 = [[MyOperation alloc] init];
    
    // 创建管理队列
    NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    
    // 设置最大并发数
    // 注意, 一定要在添加队列之前设置才有效
    [queue setMaxConcurrentOperationCount:2];
    
    // 添加进队列
    [queue addOperation:op1];
    [queue addOperation:op2];
    [queue addOperation:op3];
    [queue addOperation:op4];
    
    [op1 release];
    [op2 release];
    [op3 release];
    [op4 release];
    
}

- (IBAction)gcdAction:(id)sender {
    
//    // 创建自己的队列
//    // 参数1: 标识
//    // 参数2: DISPATCH_QUEUE_SERIAL - 串行
////            DISPATCH_QUEUE_CONCURRENT - 并行
//    dispatch_queue_t myQ = dispatch_queue_create("myQueue", DISPATCH_QUEUE_SERIAL);
//    
//    // 向队列添加任务
//    dispatch_async(myQ, ^{
//        
//        [self thAction];
//        
//    });
//    
//    dispatch_async(myQ, ^{
//        
//        [self thAction];
//        
//    });
    
    // 除了自定义队列外, 系统提供了5个队列 - 1个串行队列和4个并行队列
    // 1个串行队列: 主队列, 专门管理主线程
    // 4个并行队列: 全局队列(单例方式), 具有不同的优先级
    
//    // 主队列
//    dispatch_queue_t mainQueue = dispatch_get_main_queue();
//    
//    // 全局队列
//    // 参数1 : 优先级
//    // 参数2 : 预留参数, 只能填0
//    dispatch_queue_t globalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
//    
//    // 网络请求
//    dispatch_async(globalQueue, ^{
//        
//        NSURL *url = [NSURL URLWithString:@"http://img4.duitang.com/uploads/item/201207/28/20120728105310_jvAjW.thumb.600_0.jpeg"];
//        
//        NSData *data = [NSData dataWithContentsOfURL:url];
//        
//        UIImage *image = [UIImage imageWithData:data];
//        
//        NSLog(@"image请求完毕");
//        
////        self.imageV.image = image;
//        
//        // 分支线程对于界面铺建刷新等操作的优先级很低, 所以此类操作一般回到主线程进行
//        dispatch_async(mainQueue, ^{
//            
//            self.imageV.image = image;
//            
//        });
//        
//    });
    
    static dispatch_once_t once = 0;
    dispatch_once(&once, ^{
        
        NSLog(@"只执行一次");
        
    });
    
    
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

/*
#pragma mark - Navigation

// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    // Get the new view controller using [segue destinationViewController].
    // Pass the selected object to the new view controller.
}
*/

- (void)dealloc {
    [_imageV release];
    [super dealloc];
}
@end
